﻿//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#region << 版 本 注 释 >>

/*----------------------------------------------------------------
* 类 名 称 ：DOTweenAction
* 类 描 述 ：
* 作    者 ：henrychang
* 创建时间 ：2019/1/11 15:39:36
*******************************************************************
* Copyright @ henrychang 2018. All rights reserved.
*******************************************************************
//----------------------------------------------------------------*/

#endregion << 版 本 注 释 >>

using DG.Tweening;
using System;
using TouchFish.ObjectPool;

namespace TouchFish.NodeActionSystem
{
    public class DOTweenAction : NodeAction, IPoolable, IPoolType
    {
        private Func<Tweener> mTweenFactory;

        public static DOTweenAction Allocate(Func<Tweener> tweenFactory)
        {
            var action = SafeObjectPool<DOTweenAction>.Instance.Allocate();

            action.mTweenFactory = tweenFactory;

            return action;
        }

        protected override void OnBegin()
        {
            var tween = mTweenFactory.InvokeGracefully();

            tween.OnComplete(Finish);
        }

        public void OnRecycled()
        {
            mTweenFactory = null;
        }

        public bool IsRecycled { get; set; }

        public void Recycle2Cache()
        {
            SafeObjectPool<DOTweenAction>.Instance.Recycle(this);
        }
    }

    public static partial class IActionChainExtention
    {
        public static IActionChain DOTween(this IActionChain selfChain, Func<Tweener> tweenFactory)
        {
            return selfChain.Append(DOTweenAction.Allocate(tweenFactory));
        }
    }
}